package traveldream.ejb.EAOs;

import java.util.ArrayList;
import java.util.List;

import javax.annotation.security.RolesAllowed;
import javax.ejb.EJB;
import javax.ejb.Stateless;
import javax.persistence.EntityManager;
import javax.persistence.PersistenceContext;
import javax.persistence.Query;

import travelDream.ejb.DTOs.InvitoDTO;
import travelDream.ejb.DTOs.PrenotazioneDTO;
import travelDream.ejb.EAOs.DatiUtente;
import travelDream.ejb.EAOs.GestoreInvito;
import traveldream.ejb.converters.InvitoConverter;
import traveldream.ejb.converters.PrenotazioneConverter;
import traveldream.ejb.entities.Invito;
import traveldream.ejb.entities.Prenotazione;
import traveldream.ejb.entities.User;


@Stateless
public class GestoreInvitoEAO implements GestoreInvito {

	@PersistenceContext
    private EntityManager em;
	
	@EJB
	DatiUtente datiUtente;
	
	@EJB
	private PrenotazioneConverter prenConv;
	
	@EJB
	private InvitoConverter invConv;

	//default
	public GestoreInvitoEAO() {
	}
	
	//aggiunge un nuovo invito ad una prenotazione esistente
	@Override
	@RolesAllowed ({"CLIENTI"})
	public void addInvito (int prenotazioneID, String invitato, String invitante) { 
		Prenotazione pren = em.find(Prenotazione.class, prenotazioneID);
		User inv = em.find(User.class, invitante);
		Invito tmp = new Invito();
		tmp.setEmailInvitato(invitato);
		tmp.setCodiceLink(Integer.toString(prenotazioneID)); //TODO:per ora teniamo id della prenotazione come codice invito
		tmp.setRispRicevuta(false);
		tmp.setInvitante(inv);
		 List<Invito> inviti = pren.getInviti();
		 inviti.add(tmp);
		pren.setInviti(inviti);
		em.persist(tmp);
		em.merge(pren);
	}
	
		//trova i pacchetti per invitato
	@SuppressWarnings("unchecked")
	@Override
	@RolesAllowed ({"CLIENTI"})
	public List<PrenotazioneDTO> findByInvito (String emailInvitato) {
		Query query = em.createNamedQuery(Prenotazione.FIND_BY_INVITO, Prenotazione.class);
		query.setParameter("email", emailInvitato);
		List<Prenotazione> listaPrenotazioni = query.getResultList();
		List<PrenotazioneDTO> tmp = new ArrayList<PrenotazioneDTO>();
		for (Prenotazione pren : listaPrenotazioni)
			tmp.add(prenConv.entityToDTO(pren));
		return tmp;
	}
	
	//registra l'avvenuta risposta all'invito
	@Override
	@RolesAllowed ({"CLIENTI"})
	public void rispInvito (int prenID, String invitato) {
		Query query = em.createNamedQuery(Invito.FIND_BY_INVITATO_E_PREN, Invito.class);
		query.setParameter("prenID", prenID);
		query.setParameter("email", invitato);
		Invito inv = (Invito)query.getResultList().get(0);
		inv.setRispRicevuta(true);
		em.merge(inv);
	}
	
	
	/*
	 * @see travelDream.ejb.EAOs.GestoreInvito#findByPrenotazione(int)
	 * retituisce gli inviti di una data prenotazione, che viene passata per ID.
	 * 
	 */
	@SuppressWarnings("unchecked")
	@Override
	@RolesAllowed ({"CLIENTI"})
	public List<InvitoDTO> findByPrenotazione (int prenID) {
		Query query = em.createNamedQuery(Invito.FIND_BY_PREN, Invito.class);
		query.setParameter("prenID", prenID);
		List<Invito> listaInviti = query.getResultList();
		List<InvitoDTO> tmp = new ArrayList<InvitoDTO>();
		tmp = invConv.listInvitoEntityToDTO(listaInviti);
		return tmp;
	}
	
	@SuppressWarnings("unchecked")
	@Override
	@RolesAllowed ({"CLIENTI"})
	public List<InvitoDTO> findByPrenInvitato (int prenotazioneID, String emailInvitato) {
		Query query = em.createNamedQuery(Invito.FIND_BY_INVITATO_E_PREN, Invito.class);
		query.setParameter("prenID", prenotazioneID);
		query.setParameter("email", emailInvitato);
		List<Invito> listaInviti = query.getResultList();
		List<InvitoDTO> tmp = new ArrayList<InvitoDTO>();
		tmp = invConv.listInvitoEntityToDTO(listaInviti);
		return tmp;		
	}

	
}
